#pragma once

#include "iostream"
#include "vector"
#include "algorithm"

using namespace std;

/*HJJ QQ479287006
 *给你一个整数 n ，返回 和为 n 的完全平方数的最少数量 。

完全平方数 是一个整数，其值等于另一个整数的平方；换句话说，其值等于一个整数自乘的积。例如，1、4、9 和 16 都是完全平方数，而 3 和 11 不是。

 

示例 1：

输入：n = 12
输出：3
解释：12 = 4 + 4 + 4
示例 2：

输入：n = 13
输出：2
解释：13 = 4 + 9

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/perfect-squares
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * */


int numSquares(int n) {
//背包可以装的物品 1 4 9 16 （平方）
//然后求次数 很明显这个是组合 先物品后背包n 独立完成

    vector<int> dp(n + 1, INT_MAX - 10);
    dp[0] = 0;

    for (int i = 1; i <= n; ++i) {
        for (int j = 0; j < n + 1; ++j) {
            if (j - (i * i) >= 0)
                dp[j] = min(dp[j], dp[j - (i * i)] + 1);

        }

    }


    return dp[n];

}